package com.ls.designModel;

import java.io.Serializable;
import java.util.stream.Collectors;

/**
 * 懒汉式
 */
public class LazySingle implements Serializable {

    private static volatile LazySingle INSTANCE = null;

    private LazySingle() {
        if (INSTANCE!=null){
            throw new RuntimeException("单例不可破坏");
        }
        System.out.println("constructor");
    }

    /**
     * dcl
     * @return
     */
    public static  LazySingle getInstance(){
        if (INSTANCE==null){
           synchronized (LazySingle.class){
               // 为什么还要比较一次，因为可能出现这种情况
               // 加锁前满足 INSTANCE==null,但在加锁前也有可能其他线程已经创建了这个对象
               // 然后加锁后，如果直接创建，则会导致出现两个实例
               if (INSTANCE == null){
                   INSTANCE = new LazySingle();
               }
           }
        }
        return INSTANCE;
    }

    public static void otherMethod(){
        System.out.println("otherMethod...");
    }

    public Object readResolve(){
        return INSTANCE;
    }
}
